using System;
using System.Text.RegularExpressions;

////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Dimok.IE
//
// summary:	.
////////////////////////////////////////////////////////////////////////////////////////////////////

namespace Dimok.IE{

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Ie holder. </summary>
	///
	/// <remarks>	Dimon, 12/21/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class IEHolder : IDisposable{
		private bool disposed = false;
		private Regex title = null;

		public delegate void InitializedEventHandler(Exception exc);
		public event InitializedEventHandler Initialized;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Default constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public IEHolder(){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="title">	The title. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public IEHolder(Regex title){this.title=title;}

		#region ie
		private IE _ie = null;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the ie. </summary>
		///
		/// <value>	The ie. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public IE ie{
			get{
				if( _ie == null ){
					_ie = new Dimok.IE.IE(title);
				}
				try{
					object o = _ie.doc;
				}catch(Exception exc){
					if( Initialized != null )Initialized(exc);
					try { 
						_ie.Destroy();
						if (_wie != null) {
							_wie.Dispose();
							_wie = null;
						}
					} catch { }
					_ie = new Dimok.IE.IE(title);
				}
				return _ie;
			}
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Initialises the ie. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public IE InitIE(){
			if (_ie != null) ie.Destroy();
			if (_wie != null) _wie.Dispose();
			_ie = null;
			_wie = null;
			return ie;
		}

		WatiN.Core.IE _wie;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the wie. </summary>
		///
		/// <value>	The wie. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public WatiN.Core.IE wie {
			get {
				if (_wie == null) _wie = new WatiN.Core.IE(ie.ie);
				return _wie;
			}
		}

		#endregion

		#region IDisposable Members

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	
		/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged
		/// resources. 
		/// </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public void Dispose() {
			Dispose(true);
			GC.SuppressFinalize(this);
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	
		/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged
		/// resources. 
		/// </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="disposing">	true if resources should be disposed, false if not. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		private void Dispose(bool disposing) {
			if(!this.disposed) {
				if (_ie != null) _ie.Destroy();
				if (_wie != null) _wie.Dispose();
				_ie = null;
				_wie = null;
			}
			disposed = true;         
		}

		#endregion
	}
}